export {}

/* 
  泛型
    - 泛型是一种在定义函数、类、接口、类型别名时不指定具体类型，而在使用时在指定类型的编程方法。
    - 泛型也可以被推断，如果使用时不指定泛型的类型，TS会自动推断其类型
*/

function fn<T>(arg: T): T {
  return arg
}

function firstElement<T>(arr: T[]): T {
  return arr[0]
}

fn<string>("hello")

firstElement([1, 2, 3])

interface MyInterface<T> {
  get(): T
}

let inter: MyInterface<string> = {
  get() {
    return "hello"
  },
}

class MyClass<T> {
  property: T

  constructor(property: T) {
    this.property = property
  }
}

type MyType<T> = T
